import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/***
 * 3. 具体规则实现
 * 以下是两个示例规则：上下游关系规则和颜色兼容性规则。
 * 
 * 3.1 上下游关系规则（DependencyRule）
 * 确保零件满足上下游装配顺序（例如，车身必须先于轮毂）。
 * 
 * 说明：
 * dependencyMap 存储零件类型的上下游关系（键为上游类型，值为下游类型集合）。
 * 如果 part2 是 part1 的下游，则它们不能直接配对。
 * 
 */

public class DependencyRule implements Rule {
    private final Map<String, Set<String>> dependencyMap; // 零件类型依赖关系

    public DependencyRule() {
        this.dependencyMap = new HashMap<>();
    }

    // 添加上下游关系（downstream依赖upstream）
    public void addDependency(String upstreamType, String downstreamType) {
        dependencyMap.computeIfAbsent(upstreamType, k -> new HashSet<>()).add(downstreamType);
    }

    @Override
    public boolean isValid(Part part1, Part part2) {
        String type1 = part1.getType();
        String type2 = part2.getType();
        // 如果type2依赖type1，则type1必须先装配
        Set<String> downstreams = dependencyMap.getOrDefault(type1, Collections.emptySet());
        return !downstreams.contains(type2); // 如果type2是type1的下游，则不合法
    }

    @Override
    public String getDescription() {
        return "依赖规则[Dependency Rule]：确保正确的上下游关系。\n";
    }
}